\documentclass[a4paper, 11pt]{article}

\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=1cm,includeheadfoot]{geometry}


\usepackage{graphicx}
\usepackage{epsf}
\usepackage{here}
\pagestyle{headings}

\parindent 0pt

\title{Molekularbiologische Datenbanken für Studierende der Informatik
	 Datenbankprojekt ArrayExpress}
\author{Sebastian Horwege, Sebastian Lindner und Marc Zöller}

\begin{document}

\maketitle
\newpage
\tableofcontents

\newpage
\section{Einleitung}
Im Rahmen der Vorlesung \emph{Molekularbiologische Datenbanken / Angewandte Bioinformatik I} sollte eine relationale Datenbank erstellen werden, in der Informationen aus der \emph{UniProt}-Datenbank gespeichert werden. Dazu wurde eine Liste mit \emph{UniProt accession numbers}, im Folgenden als \emph{UniProtID} bezeichnet, bereitgestellt. Diese UniProtIDs sollten mit Hilfe der \emph{UniProtJAPI}\footnote{Website unter http://www.ebi.ac.uk/uniprot/remotingAPI/} in die Datenbank importiert werden. Dabei waren die wichtigen Informationen zu jeder ID der Proteinname, der Genname und, falls vorhanden, die Namen der Isoformen. Außerdem sollten Gewebe aus der \emph{ArrayExpress}-Datenbank identifiziert und in der Datenbank gespeichert werden.\\

Zusätzlich zur Aufgabenstellung wurde der Beschluss gefasst, eine einfach zu bedienende Oberfläche für die Datenbank zu erstellen. Diese Oberfläche wurde als Website/Webinterface implementiert, da so die komplette Datenbank auf einen Server verlagert werden kann. Dies hat den Vorteil, dass die Datenbank unabhängig vom Benutzer ist und von mehreren Personen genutzt werden kann. Dabei wurde darauf geachtet, dass ein einfacher Import und Export möglich ist, dass alle Einstellungen verändert werden können und die Website intuitiv bedienbar ist. Um dies umzusetzen wurde die Website mit \emph{Java Server Pages (JSP)}\footnote{Website unter http://www.oracle.com/technetwork/java/javaee/jsp/index.html} erstellt. Dies bedeutet, dass die Website aus JSP Dateien besteht und der Rest des Programmes in Java geschrieben wurde. Bei der Entwicklung wurde als Server \emph{Apache Tomcat}\footnote{Website unter http://tomcat.apache.org/} benutzt. Da hier alle Funktionen getestet wurden, wird er auch beim Gebrauch der Datenbank empfohlen.\\

Zur Organisation des Quellcodes und des Projektmanagements wurde die Versionverwaltungssoftware \emph{Subversion} benutzt. Das ganze Projekt ist auf \emph{Google Code}\footnote{Website unter http://code.google.com/p/molekularbiologische-datenbanken/} gehostet.\\ 

Das Projekt wurde in drei Teile gegliedert, für die jeweils ein Gruppenmitglied verantwortlich war. In der Verantwortungsbereich von Sebastian Horwege fiel die Einbindung der \emph{ArrayExpress}-Datenbank und das Design der Website zuständig. Sebastian Linder hat die Datenbank erstellt und die Kommunikation mit der Datenbank programmiert. Marc Zöller war für die Einbindung der \emph{UniProt}-Datenbank und das Design des Programms zuständig. Trotz dieser Einteilung hat jeder die Arbeit der anderen kontrolliert und Verbesserungsvorschläge eingebracht.

\newpage
\section{Programmstruktur}

Das Programm gliedert sich in zwei Bereiche, in die sogenannten \emph{Web Pages} und \emph{Source Packages}. In den \emph{Web Pages} befinden sich alle Dateien, die für die Visualisierung des Datenbank Interfaces zuständig sind. Dazu gehören JSP- und CSS-Dateien. Die Source Packages enthalten den kompletten Java-Code, der sowohl für die Datenbankanbindung als auch für die Verarbeitung der HTTP-Requests, die vom Benutzer gestellt werden, zuständig ist.

Zu jeder Website, insgesamt fünf, gibt es eine Servlet-Klasse, die \emph{javax.servlet.http.HttpServlet}\footnote{Siehe http://docs.oracle.com/javaee/1.4/api/javax/servlet/http/HttpServlet.html} erweitert, die für die Verarbeitung des HTTP-Requests zuständig ist. Die Servlet-Klasse kann bei Bedarf weitere Utility-Klassen benutzen, um die Anfrage zu verarbeiten.\\

\textbf{HomePage}: Hier kann der Benutzter Querys erstellen und diese in der Datenbank ausführen. Die\\\hspace*{10mm}Ergebnisse werden dynamisch in die Website geladen.

\textbf{OverviewPage}: Hier können alle Informationen zu einer UniProtID abgerufen werden, die in der\\\hspace*{10mm}Datenbank gespeichert sind. Diese Website dient nur zum vereinfachten Abrufen aller\\\hspace*{10mm}Information und nicht zum Export.

\textbf{SettingsPage}: Hier können alle Einstellungen verändert werden. Außerdem besteht die Möglichkeit\\\hspace*{10mm}die Datenbank unter Unix-System komplett in den RAM zu laden. Dadurch wird die\\\hspace*{10mm}Reaktions- und Arbeitszeit der Datenbank stark beschleunigt.

\textbf{ExportPage}: Hier kann (ein Teil) der Datenbank in einen String exportieren werden. Das Ergebnis\\\hspace*{10mm}wird in einem neuen Tab geöffnet.

\textbf{ImportPage}: Hier kann eine Liste von UniProtIDs im ACC-Format importiert werden.\\

\subsection{Programmablauf}
Zunächst werden die drei besonderen Klassen \emph{SQLiteDB}, \emph{ApplicationConfig} und \emph{Protein} vorgestellt:

\paragraph{ApplicationConfig} Die Klasse \emph{ApplicationConfig} verwaltet alle Einstellungen, wie z.B. den Pfad zur Datenbank oder den Link zur \emph{ArrayExpress}-Website. Dadurch sind alle wichtigen Informationen zentral gespeichert. Dies hat den Vorteil, dass alle Klassen immer mit den selben Informationen arbeiten und es einfach ist Einstellungen zu ändern. Es wird außerdem ein Ordner \emph{MolDat} im Verzeichnis \$CATALINA\_HOME/bin\footnote{Siehe http://tomcat.apache.org/tomcat-6.0-doc/setup.html} angelegt. Dort werden die Datenbank, eine Text-Datei mit allen Gen-Synonymen\footnote{Website unter http://www.genenames.org/cgi-bin/hgnc\_stats} und eine Datei \emph{MolDat.properties} erstellt. In der letzten Datei werden alle Einstellungen gespeichert, die beim Programmstart eingelesen wird.

\paragraph{SQLiteDB} Die Klasse \emph{SQLiteDB} verwaltet die gesamte Kommunikation zwischen dem Programm und der Datenbank. Es werden \emph{PreparedStatement}s\footnote{Siehe http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/PreparedStatement.html} zum schnelleren Einfügen und Lesen von neuen Proteinen bereitgestellt. Außerdem gibt es noch ein weiteres \emph{Statement}\footnote{Siehe http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html}, dass beliebige Querys des Benutzers ausführen kann.

\paragraph{Protein} Als dritte besondere Klasse existiert die Container-Klasse \emph{Protein}. Diese Klasse enthält alle Informationen zu einer UniProtID und wird nur benutzt um die Daten zu dieser UniProtID zwischen den einzelnen Klassen zu übertragen.\\

%diesen Abstaz vor die Graphik
In der obersten Ebene befinden sich die fünf Websites, die ihre Anfragen an die Servlets in der nächsten Ebene weiterleiten. Die meisten Servlets benutzen dann maximal eine Utility-Klasse und die Klassen \emph{SQLiteDB} und \emph{ApplicationConfig}. Etwas komplexer ist der Ablauf beim Import neuer Daten. Dafür existiert die Klasse \emph{Importer}, die eine UniProtID zum Importieren übergeben bekommt. Es wird zunächst überprüft, ob diese ID bereits in der Datenbank enthalten ist. Falls dies nicht der Fall ist, werden mit Hilfe der Bibliothek \emph{UniProtJAPI}\footnote{Website unter http://www.ebi.ac.uk/uniprot/remotingAPI/} Informationen von der \emph{UniProt}-Website\footnote{Website unter http://www.uniprot.org/} heruntergeladen. Außerdem werden weitere Daten von der \emph{ArrayExpress}-Website\footnote{Website unter http://www.ebi.ac.uk/arrayexpress/} benötigt. Diese Daten werden als XML heruntergeladen und dann geparst. Alle so gesammelten Informationen werden in einem \emph{Protein} gespeichert, welches an die Klasse \emph{SQLiteDB} übergeben wird, um die Daten in der Datenbank zu speichern.\\

Folgenden Abbildung stellt die interne Verarbeitung der HTTP-Requests graphisch dar. 

\begin{figure}[h!]
\includegraphics[width=1\textwidth,natwidth=986,natheight=414]{Overview_MolDat.jpeg}
\caption{Die internen Abläufe und Zusammenhänge des Programms}
\end{figure}

\subsection{Performance-Optimierung}
Der Import einer UniProtID in die Datenbank dauert sehr lange. Deshalb wurden mehrere Optimierungen im Programmablauf vorgenommen.

Zum Einen sollen die Zugriffszeiten auf die Datenbank möglichst gering gehalten werden. Dafür werden \emph{PreparedStatements} anstelle von "normalen" \emph{Statements} benutzt. Dadurch wird die Rechenzeit zum Erzeugen eines neuen Statements reduziert. Außerdem wird eine Funktion zur Verfügung gestellt, die es ermöglicht unter Unix-Systemen die komplette Datenbank in den RAM zu laden. Dies geschieht, indem die Datenbank in der Ordner /dev/shm/ verschoben wird. Dieser Bereich beinhaltet den \emph{Shared Memory}\footnote{Siehe http://en.wikipedia.org/wiki/Shared\_memory} eines Unix-Systems. Dadurch werden wesentlich schnellere Zugriffszeiten erreicht.

Auf der anderen Seite wurde das Sammeln aller benötigten Daten optimiert. So wird zum Beispiel ein XML-Parser zum Parsen der \emph{ArrayExpress}-XML Dateien benutzt, der auf dem \emph{StAX}-Prinzip\footnote{Siehe http://docs.oracle.com/cd/E13222\_01/wls/docs90/xml/stax.html} beruht. Dieses bietet eine schneller Verarbeitung\footnote{Siehe http://docs.oracle.com/javaee/5/tutorial/doc/bnbdw.html} als das herkömmliche \emph{DOM}-Prinzip.\footnote{Siehe http://www.ibm.com/developerworks/xml/library/x-databdopt2/} Dies liegt an den verschiedenen Arbeitsweisen der Prinzipien. Der \emph{DOM} Parser erstellt zunächst einen Baum basierend auf dem XML File, was zwar schnellen, wahlfreien Zugriff ermöglicht, jedoch beim Erstellen relativ viel Zeit benötigt. Der \emph{StAX}-Parser durchläuft das XML Dokument linear (wie ein \emph{Iterator}) und liefert immer nur das nächste Element des Dokumentes. Dies reicht Extrahieren der Informationen komplett aus und daher kann der Aufwand für die Erstellung des \emph{DOM}-Baums eingespart werden.

Beide Verfahren wurden beim Erstellen des Programms getestet. Ein Parser auf \emph{StAX}-Basis arbeitet im Schnitt bei jeder importierten UniProtID eine Sekunde schneller. Bei einen kompletten Import spart man dadurch circa 1500 Sekunden, was etwa 25 Minuten entspricht.\\

Durch die Verbesserungen wurde erreicht, dass bei jeder importierten UniProtID circa 35\% der Zeit zum Download der aller Informationen und 60\% zum Schreiben in die Datenbank benötigt werden. Die fehlenden 5\% sind Verwaltungs-Overhead.

\newpage
\section{Genexpressionsanalyse}
Der Prozess der Genexpressionsanalyse soll hier an einem Beispiel erklärt werden. Dabei wird auf Ergebnisse eines Experiments, indem das Gen \emph{ENSG00000100410} untersucht wurde, eingegangen. Die Daten stammen aus der \emph{ArrayExpress}-Datenbank und finden sich zusammengefasst in der Datenbank des Projekts wieder.

Im Experiment \emph{E-GEOD-35261} wurden insgesamt 65 Gewebe des menschlichen Körpers untersucht, davon 20 ausgewählte Gewebe des zentralen Nervensystems. Die Gewebeproben wurden 10 Spendern unterschiedlichen Alters post mortem entnommen.\footnote{Siehe http://www.ebi.ac.uk/arrayexpress/experiments/E-GEOD-3526} Das Experiment wurde mit Microarrays durchgeführt, die das gesamte menschliche Genom umfassen.\footnote{Siehe http://www.affymetrix.com/estore/browse/products.jsp?productId=131455} Darunter auch das Gen \emph{ENSG00000100410}, bei dem Expressionen in 14 Geweben festgestellt wurden.

\subsection{Microarrays}
Microarrays dienen der parallelen Analyse von Genexpressionen zu einer bestimmten Probe. Die Microarrays bestehen aus einer Matrix von RNA- oder DNA-Spots, also Nukleotidstränge, die bekannten Genen zugeordnet werden können und die zur Hybridisierung mit den jeweiligen Komplementen aus der Probe RNA fähig sind. Es ist vorgesehen, dass mehrere Spots das gleiche Gen präsentieren.

Die Reflektion der einzelnen Spots wird gemessen. Spots, mit vielen Hybridisierungen reflektieren anders, als solche mit wenigen. Die Ergebnisse eines Experiments, also die Aussagen über hoch- oder runterregulierte Gene, werden qualitativ bewertet, indem zu einem Gen ein \emph{p-Wert} als Kombination aus allen \emph{p-Werten} der Spots, die das gleiche Gen präsentieren, berechnet wird.\footnote{Siehe http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2735944/} Dieser gibt an, wie wahrscheinlich es ist, dass eine Beobachtung rein zufällig gemacht wurde.\footnote{Siehe http://en.wikipedia.org/wiki/Gene\_expression\_profiling\#Statistical\_analysis} Aussagen über Genexpressionen sind immer relativ und orientieren sich an absoluten Werten eines normalexprimierten Gens.

Im Hippocampus als konkretes Beispiel, ist das Gen runterreguliert, mit einem p-Wert von 0,043. In Abbildung 2 sind alle Expressionsexperimente zum Gen dargestellt. Darunter auch 14 Ergebnisse aus dem vorgeführten Experiment.

\begin{figure}[!h]
\includegraphics[width=1\textwidth,natwidth=640,natheight=480]{plot.png}
\caption{Genexpressionsexperimente des Gens \emph{ENSG00000100410}. Die \emph{ArrayExpress}-Datenbank stellt für dieses Gen Experimente zu 54 \emph{Organismparts} zur Verfügung (X-Achse). Die Abfolge der \emph{Organismparts} ist alphabethisch, rot dargestellt sind die Experimente, bei denen das Gen im untersuchten Gewebe runterreguliert gewesen ist. Grün beduetet, dass das Gen hochreguliert ist. Nicht dargestellt sind die p-Werte der einzelnen Ergebnisse, diese liegen meist zwischen 0\% - 5\% bei existierenden Experimenten und bei 100\% bei fehlenden. Diese Werte deuten darauf hin, dass die Daten signifikant sind.}
\end{figure}


\subsection{Nutzen der Genexpressionsanalyse}
Genexpressionen sind von vielen Faktoren abhängig. Unter anderem ist relevant in welchem Medium sich eine Zelle befindet, oder welche Stoffwechselprozesse gerade in der Zelle ablaufen.

\emph{Microarray}-Daten können auf intrazellulärer Ebene aufzeigen wie Signalkaskaden entstehen und wie diese auf andere \emph{Pathways} Einfluss nehmen. Beispielhaft wäre eine Reaktion auf die Behandlung einer Zelle. Globale Veränderungen im Organismus können auch analysiert werden, indem man Genexpressionen in verschiedenen Geweben vergleicht.\footnote{Siehe http://jcs.biologists.org/content/113/23/4151.full.pdf}

\clearpage

\section{Datenbank}
\subsection{JDBC Treiber}
Da das Projekt in der Programmiersprache Java erstellt wurde, war die Wahl eines \emph{JDBC-Treibers} notwendig. Dieser Treiber ermöglicht es einer Java Applikation auf eine Datenbank zuzugreifen. Er stellt die Verbindung zu der Datenbank her und implementiert das \emph{Java Database Connectivity} Protokoll. Dies ermöglicht den Austausch von Anfragen und Ergebnissen zwischen dem Benutzer und der Datenbank.\footnote{Siehe http://en.wikipedia.org/wiki/JDBC\_driver}\\
Unsere Wahl fiel auf das \emph{Xerial Projekt}\footnote{Website unter http://www.xerial.org/trac/Xerial}, weil dieses Projekt alle benötigten Programmbibliotheken (\emph{Libraries}) aller bekannten Betriebssysteme in einer einzelnen \emph{JAR}-Datei zusammenführt, sodass eine plattformunabhängige (d.h. Windows, Mac OS X und Linux werden unterstützt) Datenbankanbindung gegeben ist, die durch einfaches Einbinden einer \emph{JAR}-Datei gewährleistet wird.

\subsection{SQLiteDB.java}
Hier soll die Java Implementation der Datenbank, die Klasse \emph{SQLiteDB}, vorgestellt werden.\\
Es wird eine Methode bereitgestellt, die beim Programmstart dafür sorgt, dass eine Verbindung mit der Datenbank hergestellt wird. Hierbei werden alle nötigen Einstellungen aus den dafür vorgesehenen Dateien geladen und, falls nötig, die grundlegende Struktur der Datenbank erstellt.\\
Alle nötigen Einstellungswerte werden aus der \emph{ApplicationConfig}-Klasse geladen. Nun wird die Datenbankverbindung über den \emph{JDBC-Treiber} hergestellt. Einmalig wird daraufhin die Datenbank überprüft, indem die Anzahl der Tabellen gezählt wird. Sollte diese Anzahl nicht mit der benötigten Anzahl übereinstimmen, wird die gesamte Datenbankstruktur neu aufgesetzt.\\
Als nächstes werden \emph{Prepared Statements} deklariert und initialisiert. Ein \emph{Prepared Statement} ist ein vorkompilierter Datenbankbefehl mit offenen Parametern. Das führt dazu, dass der \emph{Overhead}, der beim Kompilieren des Statements anfällt, nur einmalig bearbeitet werden muss. Bei häufigem Aufruf eines \emph{Prepared Statements} wird so ein Performancegewinn erzielt.\footnote{Siehe http://en.wikipedia.org/wiki/Prepared\_statement}
Da die meisten Aktionen, die auf die Datenbank angewendet werden immer dieselben mit variablen Parametern sind, konnten diese in \emph{Prepared Statements} initialisiert werden. Folglich laufen alle üblichen Schreib- und Lesevorgänge über diese \emph{Prepared Statements} ab. Lediglich benutzerdefinierte Datenbankbefehle werden über langsamere \emph{Statements} behandelt.\\
Es werden außerdem alle nötigen Methoden zum einfachen Hinzufügen und Lesen von Proteinen implementiert, so dass auf alle möglichen Fehler geprüft wird und ein sicheres Schreiben und Lesen von Proteinen gewährleistet ist.

\subsection{Entity-Relationship-Modell}
\begin{figure}[!h]
\includegraphics[scale=0.6, natwidth=702,natheight=413]{model.jpeg}\caption{Grafische Darstellung unseres Modells, \emph{\underline{unterstrichen}} = \emph{Primary Key}}
\end{figure}
Ein \emph{Primary Key} ist ein einzigartiger Schlüssel einer Tabelle, der jeden Eintrag klar identifizierbar macht.\footnote{Siehe http://databases.about.com/cs/administration/g/primarykey.htm}
Proteine sind durch ihre \emph{UniProtID} auffindbar. Auch alle anderen Tabellen enthalten eine ID, sodass die Einträge durch klare \emph{ID}s voneinander unterscheidbar sind.\\
Ein \emph{Foreign Key} referenziert einen \emph{Primary Key} einer anderen Tabelle und dient somit als Verweis zwischen zwei Tabellen.\footnote{Siehe http://databases.about.com/cs/specificproducts/g/foreignkey.htm}
Zum Beispiel hat jedes Protein einen eindeutigen Verweis auf ein zugehöriges Gen. Die \emph{genID}, die in der Protein-Tabelle als \emph{Foreign Key} liegt, referenziert somit den \emph{Primary Key} der Gen-Tabelle.
So sind alle Tabellen untereinander verknüpft, wodurch fehlerfreie Lese- und Schreibfunktionen ermöglicht werden. Es wird überprüft, ob alle Teilinformationen vorhanden sind und gegebenenfalls auf Inkonsistenzen hingewiesen.\\
Auch die quantitative Relation zwischen den Tabellen ist abzulesen, so dass ein Gen zum Beispiel viele Synonyme haben kann, hier demnach eine \emph{1 : n} Relation besteht.

\newpage
\section{Probleme \& Verbesserungsmöglichkeiten}
Während der Arbeit am Projekt sind verschiedene Probleme aufgetreten. Die meisten Probleme konnten gelöst werden, im Folgenden werden allerdings noch weitere Verbesserungen vorgestellt. Insbesondere gab es größere Schwierigkeiten beim effizienten Sammeln aller Informationen für die Datenbank. 

\subsection{UniProtJAPI und ArrayExpress}
Die \emph{UniProtJAPI} ist nicht in der Lage Informationen zur zweiten Teilaufgabe des Projekts bereitzustellen. Deshalb musste auf die \emph{REST API}\footnote{Website unter http://www.ebi.ac.uk/gxa/help/AtlasApis} des \emph{Gene Expression Atlas} zurückgegriffen werden. Diese ist ein limitierender Faktor beim Erstellen der Datenbank. Die Zugriffsweise per \emph{HTTP GET request} und die Rückgabe im XML Format nimmt viel Zeit in Anspruch, da für jedes Gen einzeln eine Textdatei der Größenordnung um 1 MB heruntergeladen und geparst werden muss. Hinzu kommt, dass die API keine GET Bedingungen bereitstellt, die perfekt auf unsere Teilaufgabe passen. Dadurch müssen wesentlich mehr Daten angefordert und geparst werden, als in Wirklichkeit benötigt. Zumindest konnte der Zugriff auf die relevanten Informationen in der XML Datei beschleunigt werden.

Ein weiteres Problem war die teilweise mangelhaft Dokumentation der \emph{UniProtJAPI}. Die Grundfunktionen sind gut dokumentiert\footnote{Siehe http://www.ebi.ac.uk/uniprot/remotingAPI/javadoc/api/index.html} und mit Code Beispielen versehen.\footnote{Siehe http://www.ebi.ac.uk/uniprot/remotingAPI/doc.html} Allerdings ist die Dokumentation (größtenteils) nicht mehr vorhanden, sobald man speziellere Klassen benutzt. Ein Beispiel ist die Klassen \emph{ArrayExpress}\footnote{Siehe http://www.ebi.ac.uk/uniprot/remotingAPI/javadoc/domain/api/uk/ac/ebi/kraken/interfaces/uniprot/dbx/arrayexpress/ArrayExpress.html}. Diese Klasse enthält außerdem einen offensichtlichen Fehler, da die Methode \emph{getArrayExpressDescription()} immer einen Bindestrich (-) liefert, egal mit welcher UniProtID sie benutzt wird.

\subsection{Zugriffszeiten auf die Datenbank}
Durch die Größe der Datenbank kam es beim Erstellen und später auch beim Anfordern und Zurückliefern komplexer Datensätze zu recht langen Wartezeiten. Der Vorteil der \emph{SQLite}-Datenbank ist, dass die Anwendung gleichzeitig auch der Server ist.\footnote{Siehe http://www.sqlite.org/serverless.html} Dadurch kann die eigentliche Datenbank an jedem beliebigen Ort liegen, solange die Anwendung auf die Datenbank zugreifen kann. Es wurde entschieden die Datenbank in dem \emph{RAM} zu verschieben, welcher unter Unix Systemen wie ein ganz normaler Ordner nutzbar ist\footnote{/dev/shm}. Dieser Trick brachte eine (stark systemabhängige) Beschleunigung der Datenbankerstellung. Maximal lies sich das Befüllen der Datenbank um das Zehnfache beschleunigen.\\

Der Import der Daten ließe sich noch weiter beschleunigen, indem nicht jedes Statement einzeln an die Datenbank geschickt, sondern stattdessen ein sogenannter \emph{Batch} benutzt wird. Auf diesem Stapel sammelt man alle Statements und führt sie dann gemeinsam aus. Da nur ein \emph{Insert}-Befehl ausgeführt wird, wird die Datenbank nur einmal angesprochen. Dies führt zu weniger Kommunikation, und damit auch zu weniger Arbeitszeit.\footnote{Siehe http://www.venzi.wordpress.com/2012/03/31/loading-data-fast-regular-insert-vs-bulk-insert/} Dieses Prinzip haben wir bereits teilweise beim Einfügen der \emph{ArrayExpress}-Daten umgesetzt aber noch nicht konsequent im kompletten Import umgesetzt.

\newpage

\section{Quellenverzeichnis}
Alle Links auf Internetseiten wurden am 26.03.2013 auf ihre Korrektheit überprüft. Die Links sind nach ihrem Auftreten im Dokument sortiert.\\
Alle Abbildungen wurden selbst erstellt.\\

\ensuremath{[1]} http://docs.oracle.com/cd/E13222\_01/wls/docs90/xml/stax.html\\
\ensuremath{[2]} http://docs.oracle.com/javaee/5/tutorial/doc/bnbdw.html\\
\ensuremath{[3]} http://www.ibm.com/developerworks/xml/library/x-databdopt2/\\
\ensuremath{[4]} http://www.ebi.ac.uk/arrayexpress/experiments/E-GEOD-3526\\
\ensuremath{[5]} http://www.affymetrix.com/estore/browse/products.jsp?productId=131455\\
\ensuremath{[6]} http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2735944/\\
\ensuremath{[7]} http://en.wikipedia.org/wiki/Gene\_expression\_profiling\#Statistical\_analysis\\
\ensuremath{[8]} http://jcs.biologists.org/content/113/23/4151.full.pdf\\
\ensuremath{[9]} http://en.wikipedia.org/wiki/JDBC\_driver\\
\ensuremath{[10]} http://en.wikipedia.org/wiki/Prepared\_statement\\
\ensuremath{[11]} http://databases.about.com/cs/administration/g/primarykey.htm\\
\ensuremath{[12]} http://databases.about.com/cs/specificproducts/g/foreignkey.htm\\
\ensuremath{[13]} http://www.ebi.ac.uk/uniprot/remotingAPI/javadoc/api/index.html\\
\ensuremath{[14]} http://www.ebi.ac.uk/uniprot/remotingAPI/doc.html\\
\ensuremath{[15]} http://www.ebi.ac.uk/uniprot/remotingAPI/javadoc/domain/api/uk/ac/ebi/kraken/interfaces/uniprot/
dbx/arrayexpress/ArrayExpress.html\\
\ensuremath{[16]} http://www.sqlite.org/serverless.html\\
\ensuremath{[17]} http://www.venzi.wordpress.com/2012/03/31/loading-data-fast-regular-insert-vs-bulk-insert/\\

\end{document}